package projet;
import agent.*;
import client.*;
import forum.*;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.*;
import javax.ejb.*;


/**
 * 
 * @author Geoffroy
 *
 */
@Stateless
@Local
public class ProjetEJB implements ProjetInterface {
	
	@PersistenceContext
	EntityManager em;
	@EJB
	AgentInterface collaborateurMGR;
	@EJB
	TacheInterface tacheMGR;
	
	public void addProjet(Projet p) {
		
		em.persist(p);
	}
	
	
	public void update(Projet p) {
		em.merge(p);
	}
	
	public Projet findById(int id) {
		return (Projet)em.find(Projet.class,id);
	}

	
	public void addTache(int idProjet, Tache t) {
		Projet p = this.findById(idProjet);
		p.addTache(t);
		em.flush();
	}
	
	public void addCollaborateur(int idProjet, Agent a) {
		Projet p = this.findById(idProjet);
		p.addAgent(a);
		em.flush();
	}
	
	public void removeCollaborateur(int idProjet, int idCollaborateur) {
		Projet p = this.findById(idProjet);
		Agent a = collaborateurMGR.findById(idCollaborateur);
		p.removeAgent(a);
		em.flush();
	}
	
	public void removeTache(int idProjet, int idTache) {
		Projet p = this.findById(idProjet);
		
		Tache t = tacheMGR.findById(idTache);
		p.removeTache(t);
		em.flush();
	}
	
	public void removeProjet(int idProjet) {
		Projet p = this.findById(idProjet);
		em.remove(p);
	}
	
	public void updateAvancement(int idProjet, int avancement) {
		Projet p = this.findById(idProjet);
		p.setAvancement(avancement);
		em.flush();
	}
	
	public void updatePaye(int idProjet, boolean paye) {
		Projet p = this.findById(idProjet);
		if(paye) {
			p.setPaye();
		}
		else {
			p.setUnPaye();
		}
		em.flush();
	}
	
	public void updateNom(int idProjet, String nom) {
		Projet p = this.findById(idProjet);
		p.setNom(nom);
		em.flush();
	}
	
	public void updateChef(int idProjet,Agent c) {
		Projet p = this.findById(idProjet);
		p.setChef(c);
		em.flush();
	}
	
	
	public ArrayList<Projet> getUnPaye() {
		Query q = em.createQuery("SELECT p FROM Projet p WHERE p.paye=false");
		if(q==null) {
			return new ArrayList<Projet>();
		}
		else {
			return (ArrayList<Projet>)q.getResultList();
		}
	}
	
	
	public ArrayList<Projet> getUnPayeFromClient(int idClient) {
		Query q =em.createQuery("SELECT p FROM Projet p WHERE p.paye=false AND p.client.id ="+idClient);
		
		if(q==null) {
			return new ArrayList<Projet>();
		}
		else {
			return (ArrayList<Projet>)q.getResultList();
		}
	}
	
	
	public ArrayList<Topic> getTopics(int idProjet) {
		Query q = em.createQuery("SELECT t FROM Topic t WHERE t.projet.id = "+idProjet);
		if(q==null) {
			return new ArrayList<Topic>();
		}
		else {
			return (ArrayList<Topic>)q.getResultList();
		}
	}
	
	public ArrayList<Tache> getTacheNonTermine(int idProjet) {
		Query q  = em.createQuery("SELECT t FROM Tache t WHERE t.projet.id = "+idProjet);
		if(q==null) {
			return new ArrayList<Tache>();
		}
		else {
			return (ArrayList<Tache>)q.getResultList();
		}
	}
	
	public ArrayList<Projet> getFromChef(int idChef) {
		Query q = em.createQuery("SELECT p FROM Projet p WHERE p.chef.id="+idChef);
		if(q==null) {
			return new ArrayList<Projet>();
		}
		else {
			return (ArrayList<Projet>)q.getResultList();
		}
		
	}
	public ArrayList<Projet> getFromClient(int idClient) {
		Query q = em.createQuery("SELECT p FROM Projet p WHERE p.client.id="+idClient);
		if(q==null) {
			return new ArrayList<Projet>();
		}
		else {
			return (ArrayList<Projet>)q.getResultList();
		}
	}
	
	public ArrayList<Projet> getAll() {
		Query q = em.createQuery("SELECT p FROM Projet p");
		if(q==null) {
			return new ArrayList<Projet>();
		}
		else {
			return (ArrayList<Projet>)q.getResultList();
		}
	}
	
	public Collection<Agent> findAgentsOnProjet(int idProjet) {
		Projet p  = (Projet)em.createQuery("SELECT p FROM Projet p WHERE p.id="+idProjet).getSingleResult();
		return (Collection<Agent>)p.getAgents();
	}
	
	public ArrayList<Projet> getFromAgent(int idAgent) {
		Query q = em.createQuery("SELECT DISTINCT p FROM Projet p JOIN p.agents a WHERE a.id="+idAgent+" OR p.chef.id="+idAgent);
		return (ArrayList<Projet>)q.getResultList();
	}
	
	public void delete(int id) {
		em.remove(this.findById(id));
	}
}

